#===istalismanplugin===
# -*- coding: utf-8 -*-

# $Revision: 62 $
# $Author: rchiganov@gmail.com $
# $Date: 2013-12-22 16:33:53 +0000 (Sun, 22 Dec 2013) $

#---------------------------------------------------------------------------------------------------

import re # Регулярные выражения
import subprocess

#---------------------------------------------------------------------------------------------------

# Работаем с репой
def svn_run ( ptype, psource, pparameters ):
	lparam  = pparameters.split()
	if len(lparam) == 0:
		reply(ptype, psource, u'читай хелп по команде...')
		return

	if lparam[0] not in [ u'log', u'check', u'update' ]:
		reply(ptype, psource, u'не понимаю... *DONT_KNOW*')
		return

	lanswer = u''
	lproc = subprocess.Popen(u'svnversion -n', shell=True, stdout=subprocess.PIPE)
	lrevision = re.findall(u'\d+', lproc.communicate()[0].decode('utf-8'))[0]

	#-----------------------------------------------------------------------------------------------
	if lparam[0] == u'log':
		if len(lparam) > 2:
			reply(ptype, psource, u'читай хелп по команде...')
			return

		if len(lparam) == 2:
			try:
				lcheck = int(lparam[1])
				lrevision = lparam[1]
			except ValueError:
				reply(ptype, psource, u'это не ревизия бота... *PARDON*')
				return

		lanswer += u'Лог изменений для ревизии %s:\n' % lrevision
		lproc = subprocess.Popen(u'svn log -r %s' % lrevision, shell=True, stdout=subprocess.PIPE)
		lanswer += lproc.communicate()[0].decode('utf-8')

	#-----------------------------------------------------------------------------------------------
	elif lparam[0] == u'check':
		lrevision = 'r' + lrevision
		lproc = subprocess.Popen(u'svn log -r HEAD', shell=True, stdout=subprocess.PIPE)
		lrevlog = lproc.communicate()[0].decode('utf-8')
		lrevsrv = re.findall(u'r\d+', lrevlog)[0]

		if lrevision != lrevsrv:
			lanswer += 'Ревизия бота не совпадает с ревизией из репозитория.\nТекущая ревизия: %s\nРевизия в репе: %s\n\nНеобходимо сделать обновление бота до последней ревизии.\n\nЛог изменений последней ревизии бота:\n' % ( lrevision, lrevsrv )
			lanswer += lrevlog
		else:
			lanswer += 'Ревизия бота актуальна и обновления не требует'

	#-----------------------------------------------------------------------------------------------
	elif lparam[0] == u'update':
		lanswer += u'Выполняем обновление бота до последней ревизии:\n'
		lproc = subprocess.Popen(u'svn update', shell=True, stdout=subprocess.PIPE)
		lanswer += lproc.communicate()[0].decode('utf-8')
		lanswer += u'\nБот обновлён до последней ревизии. Для того чтобы обновления вступили в силу, необходимо сделать перезапуск бота (команда "рестарт")'

	if ptype == 'public':
		reply(ptype, psource, u'в привате')
	reply('private', psource, lanswer)

#---------------------------------------------------------------------------------------------------

register_command_handler(svn_run, '!svn', [ 'суперадмин', 'мук', 'все' ], 100, """Просмотр информации и управление обновлением бота из репозитория svn. Параметры команды:
* log - просмотр изменений текущей или указанной ревизии
* check - проверяет репу на наличие обновлений и если они есть, выводит лог изменений последнего обновления
* update - обновляет бота из репы""", '!svn [параметр]', [ '!svn', '!svn log', '!svn log 42', '!svn check', '!svn update' ])

#---------------------------------------------------------------------------------------------------
